<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script type="module">
	// 1- 引入模块
	import Promise from "./Promise.js";
	{
		const p = new Promise(function(resolve,reject){
			resolve(100);
		})
		p.then(value=>{
			console.log(value);// 100
			return value+100;
		}).then(value=>{
			console.log(value);// 200
			return value+1
		}).then(value=>{
			console.log(value);// 201
			// throw "异常"
			return new Promise(()=>{});
		}).then(value=>{
			console.log(value);// 203
			return value+5;
		}).then(value=>{
			console.log(value);// 208
		}).catch(err=>{
			console.log("err",err);
		})
	
	}
	
	
	
	
	
	
	
	
	// 2- 以下引入模块会报语法错误
	// 以下不允许
	// const murl = "./Promise.js";
	// import Promise from murl;
	// console.log(Promise);
	
	// 以下不允许
	// {
	// 	import Promise from "./Promise.js";
	// }
	//
	// 以下不允许
	// function fn(){
	// 	import Promise from "./Promise.js";
	// }
	// fn();
	
	// 3- 动态引入
	// const Promise1 = ()=>import("./Promise.js");
	// Promise1().then(value=>{
	// 	// console.log(Value.default);
	// 	// console.log(Value.num);
	// 	const obj = new value.default;
	// 	console.log(obj);
	// })
	
	// {
	// 	const murl = "./Promise.js";
	// 	const Promise = ()=>import(murl);
	// 	Promise().then(value=>{
	// 		console.log(value);
	// 	})
	// }
	
	// import Promise from "./Promise.js";
	{
		// 1- Promise是一个类（构造函数）
		// 2- 通过Promise生成的实例拥有状态（默认是pending）以及值(undefined)
		// 3- 实例化时需要传递一个回调函数（同步执行的）
		// const p = new Promise(function(){
		// 	console.log("1");
		// })
		// console.log("2",p)
	}
	{
		// 1- 实例化Promise时传入的回调函数会接收两个参数：resolve,reject
		// 2- 改变状态：
		//    pending--->fulfilled
		//    pending--->rejected
		// 3- 如何改变：
		//    调用resolve，将状态更改为 fulfilled，成功值为resolve接收的值
		//    调用reject，将状态更改为 rejected，失败的值为reject接收的值
		//    有异常，将状态更改为 rejected,失败的值为异常信息
		// 4- 状态只允许更改一次
		// const p = new Promise(function (resolve,reject){
		// 	resolve(100);
		// 	reject(1);
		// 	// throw "异常"
		// })
		// console.log(p);
	}
	{
		// then方法:
		// 1- then方法在Promise原型对象上（Promise实例的原型链上）
		// 2- then方法接收两个参数：
		//    2-1- 成功回调（实例状态为fulfilled）,接收的参数是成功值
		//    2-2- 失败回调（实例状态为rejected），接收的参数是失败值
		// 3- 成功回调与失败回调的函数执行为异步调用
		// 4- then函数返回的是一个Promise实例
		//    实例的状态取决于成功或失败回调函数的返回值。
		//    返回的是一个非promise那么p2的状态为成功，值为返回值
		//    返回的是一个promise那么p2的状态以及值与返回的Promise实例相同。
		//    成功或失败回调产生异常,p2是一个失败的promise,
		// const p = new Promise(function(resolve,reject){
		// 	resolve(100);
		// 	// throw "异常";
		// })
		// const p2 = p.then(value=>{
		// 	console.log("成功回调",value);
		// 	// return new Promise(resolve=>{
		// 	// 	resolve(100);
		// 	// });
		// },reason=>{
		// 	console.log("失败回调",reason)
		// 	throw "异常";
		// })
		// console.log("p2",p2);
	}
	{
		// 1- 执行器函数中往往处理的是异步
		// 2- then可以使用多次
		// const p = new Promise(function(resolve,reject){
		// 	setTimeout(()=>{
		// 		console.log(2)
		// 		resolve(10);
		// 	},100)
		//
		// })
		// p.then(value=>{
		// 	console.log("成功回调1",value)
		// })
		// p.then(value=>{
		// 	console.log("成功回调2",value)
		// })
		// p.then(value=>{
		// 	console.log("成功回调3",value)
		// })
		// p.then(value=>{
		// 	console.log("成功回调4",value)
		// })
	}
	
</script>
</html>